/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package biblio.bl;

import biblio.dao.DetalleprestamoDaoLocal;
import biblio.dao.LibroDaoLocal;
import biblio.dao.PrestamoDaoLocal;
import biblio.enumeracion.EstadoDetallePrestamo;
import biblio.enumeracion.EstadoTransaccion;
import biblio.modelo.Detalleprestamo;
import biblio.modelo.Libro;
import biblio.modelo.Prestamo;
import biblio.modelo.Usuario;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;

/**
 *
 * @author Grnmnd
 */
@Stateless
public class PrestamoBl implements PrestamoBlLocal {

    @EJB
    private LibroDaoLocal libroDao;
    @EJB
    private DetalleprestamoDaoLocal detalleprestamoDao;
    @EJB
    private PrestamoDaoLocal prestamoDao;

    // Add business logic below. (Right-click in editor and choose
    // "Insert Code > Add Business Method")
    public EstadoTransaccion register(Prestamo lend, List<Libro> books) {
        int avaliable = 3;
        List<Prestamo> incompleteLends = prestamoDao.findIncomplete(lend.getIdUsuario());
        for (Prestamo prestamo : incompleteLends) {
            avaliable = avaliable - detalleprestamoDao.FindLends(prestamo).size();
        }
        if (1 <= 0 || books.size() > avaliable) {
            return EstadoTransaccion.INCOMPLETO;
        } else {
            prestamoDao.create(lend);
            for (Libro b : books) {
                Detalleprestamo dp = new Detalleprestamo();
                dp.setIdLibro(b);
                dp.setIdPrestamo(lend);
                dp.setEstado(EstadoDetallePrestamo.PRESTADO.ordinal());
                detalleprestamoDao.create(dp);
            }
            return EstadoTransaccion.COMPLETO;
        }
    }

    @Override
    public EstadoTransaccion modify(Prestamo prestamo) {
        if (prestamo.getId() == null || prestamoDao.find(prestamo.getId()) == null) {
            return EstadoTransaccion.INCOMPLETO;
        } else {
            prestamoDao.edit(prestamo);
            return EstadoTransaccion.COMPLETO;
        }
    }

    @Override
    public EstadoTransaccion delete(Prestamo prestamo) {
        if (prestamo.getId() == null || prestamoDao.find(prestamo.getId()) == null) {
            return EstadoTransaccion.INCOMPLETO;
        } else {
            prestamoDao.remove(prestamo);
            return EstadoTransaccion.COMPLETO;
        }
    }

// Add business logic below. (Right-click in editor and choose
    // "Insert Code > Add Business Method")
    @Override
    public List<Prestamo> getListAll() {
        return prestamoDao.findAll();
    }

    @Override
    public EstadoTransaccion takeBack(List<Libro> books) {
        for (Libro libro : books) {
            Detalleprestamo dp = detalleprestamoDao.findBooks(libro);
            if (dp == null) {
                return EstadoTransaccion.INCOMPLETO;
            } else {
                dp.setEstado(EstadoDetallePrestamo.REGRESADO.ordinal());
                detalleprestamoDao.edit(dp);
            }
        }
        return null;
    }

    /*
     *
     * Aqui
     * FAlta 
     * completar
     * los 
     * metodos
     */
    @Override
    public List<Prestamo> incompleteLendsByUser(Usuario user) {
        return prestamoDao.findIncomplete(user);
    }

    @Override
    public List<Detalleprestamo> lendBooksByUser(Usuario user) {
        List<Detalleprestamo> ldp = new ArrayList<Detalleprestamo>();
        for (Prestamo prestamo : prestamoDao.findIncomplete(user)) {
            for (Detalleprestamo dpd : detalleprestamoDao.FindLends(prestamo)) {
                if (libroDao.find(dpd.getIdLibro()).getDisponible()) {
                    ldp.add(dpd);
                }
            }
        }
        if (ldp.isEmpty()) {
            return null;
        } else {
            return ldp;
        }
    }

    @Override
    public List<Prestamo> generalIncompleteLends() {
        List<Prestamo> gil = null;
        for (Prestamo prestamo : prestamoDao.findAll()) {
            if (prestamo.getEstado() == 0) {//comprobar el No. de estado
                gil.add(prestamo);
            }
        }
        if (gil.isEmpty()) {
            return null;
        } else {
            return gil;
        }

    }

    @Override
    public List<Detalleprestamo> generalLendsBooks() {
        List<Detalleprestamo> glb = null;
        for (Prestamo prestamo : generalIncompleteLends()) {
            for (Detalleprestamo detalleprestamo : prestamo.getDetalleprestamoList()) {
                if (detalleprestamo.getEstado() == 0) {
                    glb.add(detalleprestamo);
                }
            }
        }
        if (glb.isEmpty()) {
            return null;
        } else {
            return glb;
        }
    }
}
